Diese Frage hat hier bereits Antworten: Keine implizite Konvertierung im überladenen Operator (2 Antworten) Vor 7 Jahren geschlossen. Ich schreibe einen einfachen Wrapper für einen Elementartyp und versuche zu vermeiden, dass zu viele Varianten von Standardoperatoren geschrieben werden müssen. Ich hatte gehofft, dass eine implizite Typkonvertierung helfen würde, aber das tut es nicht. Hier ist ein reduziertes Beispiel: struct Int { int _i; Int (int i = 0): _i {i} {} Int-Operator + (const Int & rhs) {return _i + rhs._i;} }; int main (int argc, char * argv []) { (nichtig) (Int (1) + 2); // Gut (nichtig) (2 + Int (1)); // Fehler: Ungültige Operanden für binären Ausdruck ('int' und 'Int') }} Ich benutze llvm. Die erste Zeile der Hauptkompilierungen funktioniert einwandfrei. Der zweite verursacht einen Fehler. Ich hatte gehofft, dass in der zweiten Zeile 2 implizit in Int (2) konvertiert wird, gefolgt von einem Aufruf von Operator +. Warum passiert das nicht? Warum findet die implizite Konvertierung in der ersten Zeile statt?
2021-03-01 08:18:04
Dies geschieht in der ersten Zeile, weil der einzige verfügbare Operator + der Operator + (Int &) ist (der für diese Instanz einen impliziten ersten Parameter von Int hat). Die zweite Zeile schlägt fehl, da der erste Parameter ein int ist und keine Ahnung hat, dass er vor dem Versuch der Operation konvertiert werden muss (er weiß nicht, dass Int :: operator + verwendet werden muss). Sie können dieses Problem vermeiden, indem Sie den Operator zu einer Funktion eines Freundes ohne Mitglied machen (http://ideone.com/YCf7wX). struct Int { int _i; Int (int i = 0): _i {i} {} Freund Int Operator + (const Int & lhs, const Int & rhs); }; Int-Operator + (const Int & lhs, const Int & rhs) { return lhs._i + rhs._i; }} int main () { Int i; i + 5; 5 + i; return 0; }} | Nicht die Antwort, die Sie suchen? Durchsuchen Sie andere Fragen mit dem Tag c ++ operator-keyword implicit-convert oder stellen Sie Ihre eigene Frage.